package com.yw.uglygeeker.utils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;

import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;

/**
 * 日期转换工具类
 * 
 * @author devintam
 * 
 * @date 2015-07-10
 */
public class DateUtil extends DateUtils {

	public static final TimeZone UTC_TIME_ZONE = TimeZone.getTimeZone("GMT+8");

	public static String[] parsePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss",
			"yyyy/MM/dd HH:mm" };

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd）
	 */
	public static String getDate() {
		return getDate("yyyy-MM-dd");
	}

	/**
	 * 得到当前日期字符串 格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String getDate(String pattern) {
		return DateFormatUtils.format(new Date(), pattern);
	}

	/**
	 * 格式化日期 字符串默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
	 */
	public static String formatDate(Date date, Object... pattern) {
		String formatDate = null;
		if (pattern != null && pattern.length > 0) {
			formatDate = DateFormatUtils.format(date, pattern[0].toString());
		} else {
			formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
		}
		return formatDate;
	}
	
	/**
	 *格式化日期 字符串默认格式（yyyy-MM-dd） pattern可以为："yyyy-MM-dd" "HH:mm:ss" "E"
     */
	public static String formatDate(long millSec,Object... pattern){
		 String formatDate = null;
	     Date date= new Date(millSec);
	     if (pattern != null && pattern.length > 0) {
				formatDate = DateFormatUtils.format(date, pattern[0].toString());
			} else {
				formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
			}
	     return formatDate;
    }

	/**
	 * 得到日期字符串 可带有'T'或z(GMT+08:00)
	 */
	public static String formatUTC(Date date, String pattern) {
		return DateFormatUtils.format(date, pattern, UTC_TIME_ZONE);
	}

	/**
	 * 得到日期字符串 可带有'T'或z
	 */
	public static String formatUTC(Date date, String pattern, TimeZone zone) {
		return DateFormatUtils.format(date, pattern, zone);
	}

	/**
	 * 得到当前时间字符串 格式（HH:mm:ss）
	 */
	public static String getTime() {
		return formatDate(new Date(), "HH:mm:ss");
	}

	/**
	 * 得到当前日期和时间字符串 格式（yyyy-MM-dd HH:mm:ss）
	 */
	public static String getDateTime() {
		return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
	}

	/**
	 * 得到当前年份字符串 格式（yyyy）
	 */
	public static String getYear() {
		return formatDate(new Date(), "yyyy");
	}

	/**
	 * 得到当前月份字符串 格式（MM）
	 */
	public static String getMonth() {
		return formatDate(new Date(), "MM");
	}

	/**
	 * 得到当天字符串 格式（dd）
	 */
	public static String getDay() {
		return formatDate(new Date(), "dd");
	}

	/**
	 * 得到当前星期字符串 格式（E）星期几
	 */
	public static String getWeek() {
		return formatDate(new Date(), "E");
	}

	/**
	 * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
	 * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
	 */
	public static Date parseDate(Object str) {
		if (str == null) {
			return null;
		}
		try {
			return parseDate(str.toString(), parsePatterns);
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * 获取过去的天数
	 * 
	 * @param date
	 * @return
	 */
	public static long pastDays(Date date) {
		long t = new Date().getTime() - date.getTime();
		return t / (24 * 60 * 60 * 1000);
	}

	/**
	 * 
	 * TODO(获取时间点Long值)
	 *
	 * @param timeStr
	 * @return long
	 */
	public static long getTeDTime(String timeStr) {
		long datetime = 0L;
		if (StringUtils.isNotBlank(timeStr)) {
			String[] str = timeStr.split(":");
			if (str.length == 3) {
				datetime = Integer.parseInt(str[0]) * (60 * 60 * 1000) + Integer.parseInt(str[1]) * (60 * 1000) + Integer.parseInt(str[2]) * (1000);
			} else if (str.length == 2) {
				datetime = Integer.parseInt(str[0]) * (60 * 60 * 1000) + Integer.parseInt(str[1]) * (60 * 1000);
			} else {
				datetime = Integer.parseInt(timeStr) * (60 * 1000);
			}
		}
		return datetime;
	}

	/**
	 * 计算2个日期之间的相隔天数
	 * 
	 * @param d1
	 *            日期1
	 * @param d2
	 *            日期2
	 * @return 日期1和日期2相隔天数
	 */
	public int getDaysBetween(Calendar d1, Calendar d2) {
		if (d1.after(d2)) {
			Calendar swap = d1;
			d1 = d2;
			d2 = swap;
		}
		int days = d2.get(Calendar.DAY_OF_YEAR) - d1.get(Calendar.DAY_OF_YEAR);
		int y2 = d2.get(Calendar.YEAR);
		if (d1.get(Calendar.YEAR) != y2) {
			d1 = (Calendar) d1.clone();
			do {
				days += d1.getActualMaximum(Calendar.DAY_OF_YEAR);
				d1.add(Calendar.YEAR, 1);
			} while (d1.get(Calendar.YEAR) != y2);
		}
		return days;
	}

	/**
	 * 比较时间大小
	 * 
	 * @param date1
	 * @param date2
	 * @return
	 */
	public static long getDatediffByTwoDate(String beginDate, String engDate, String pattern) {
		if (pattern == null)
			pattern = "yyyyMM";
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		long time3 = 0;
		try {
			long time1 = df.parse(beginDate).getTime();
			long time2 = df.parse(engDate).getTime();
			time3 = time1 - time2;
		} catch (ParseException e) {
			e.printStackTrace();
		}
		return time3;
	}

	/**
	 * 获取月份加减
	 * 
	 * @param date
	 * @param month
	 * @param pattern
	 * @return
	 */
	public static String getMonthDiff(Date date, int month, String pattern) {
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.MONTH, calendar.get(Calendar.MONTH) - month);
		return df.format(calendar.getTime());
	}

	/**
	 * 获取天数加减
	 * 
	 * @param date
	 * @param month
	 * @param pattern
	 * @return
	 */
	public static String getDayDiff(Date date, int day, String pattern) {
		SimpleDateFormat df = new SimpleDateFormat(pattern);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(date);
		calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - day);
		return df.format(calendar.getTime());
	}

	/**
	 * 计算2个日期之间的工作天数（去除周六周日）
	 * 
	 * @param d1
	 *            日期1
	 * @param d2
	 *            日期2
	 * @return 日期1和日期2之间的工作天数
	 */
	public int getWorkingDay(Calendar d1, Calendar d2) {
		int result = -1;
		if (d1.after(d2)) {
			Calendar swap = d1;
			d1 = d2;
			d2 = swap;
		}
		// 开始日期的日期偏移量
		int chargeStartDate = 0;
		// 结束日期的日期偏移量
		int chargeEndDate = 0;
		int stmp;
		int etmp;
		stmp = 7 - d1.get(Calendar.DAY_OF_WEEK);
		etmp = 7 - d2.get(Calendar.DAY_OF_WEEK);
		// 日期不在同一个日期内
		if (stmp != 0 && stmp != 6) {// 开始日期为星期六和星期日时偏移量为0
			chargeStartDate = stmp - 1;
		}
		if (etmp != 0 && etmp != 6) {// 结束日期为星期六和星期日时偏移量为0
			chargeEndDate = etmp - 1;
		}
		result = (getDaysBetween(this.getNextMonday(d1), this.getNextMonday(d2)) / 7) * 5 + chargeStartDate - chargeEndDate;
		return result;
	}

	/**
	 * 获取当前星期
	 * 
	 * @param date
	 *            当前日期
	 * @param character
	 *            zh : 标识中文 ， en : 标识英文（默认）
	 * @return 当前日期
	 */
	public String getChineseWeek(Calendar date, String character) {
		String dayNames[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };

		if ("zh".equals(character)) {
			dayNames[0] = "星期日";
			dayNames[1] = "星期一";
			dayNames[2] = "星期二";
			dayNames[3] = "星期三";
			dayNames[4] = "星期四";
			dayNames[5] = "星期五";
			dayNames[6] = "星期六";
		}
		int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
		return dayNames[dayOfWeek - 1];
	}

	/**
	 * 获得日期的下一个星期一的日期
	 * 
	 * @param date
	 * @return
	 */
	public Calendar getNextMonday(Calendar date) {
		Calendar result = null;
		result = date;
		do {
			result = (Calendar) result.clone();
			result.add(Calendar.DATE, 1);
		} while (result.get(Calendar.DAY_OF_WEEK) != 2);
		return result;
	}

	/**
	 * 计算两个日期之间的非工作日天数
	 * 
	 * @param d1
	 *            日期1
	 * @param d2
	 *            日期2
	 * @return 日期1与日期2之间的非工作天数
	 */
	public int getHolidays(Calendar d1, Calendar d2) {
		return this.getDaysBetween(d1, d2) - this.getWorkingDay(d1, d2);

	}

	/**
	 * 
	 * 将90分钟转化为 1:30
	 *
	 * @param x
	 * @return String
	 */
	public static String formateNumberToDate(int i) {
		String formateS = "";
		int x = i % 60;
		int y = i / 60;
		if (x == 0) {
			formateS = y + ":" + x + "0";
		} else if (x != 0 && (x + "").length() == 1) {
			formateS = y + ":0" + x;
		} else {
			formateS = y + ":" + x;
		}
		return formateS;
	}

	/**
	 * 
	 * 比较二个时间是否跨天
	 *
	 * @param fDate
	 * @param oDate
	 * @return int
	 * @throws ParseException
	 */
	public static int daysOfTwo(String date1, String date2) throws ParseException {

		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
		Date d1 = sf.parse(date1);
		Date d2 = sf.parse(date2);

		Calendar aCalendar = Calendar.getInstance();

		aCalendar.setTime(d1);

		int day1 = aCalendar.get(Calendar.DAY_OF_YEAR);

		aCalendar.setTime(d2);

		int day2 = aCalendar.get(Calendar.DAY_OF_YEAR);

		return day2 - day1;

	}

	/**
	 * 
	 * 求2时间之间的 分钟差数字
	 *
	 * @param date1
	 * @param date2
	 * @return
	 * @throws ParseException
	 *             int
	 */
	public static int getMinute(String date1, String date2) throws ParseException {
		Calendar dateOne = Calendar.getInstance(), dateTwo = Calendar.getInstance();

		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		dateOne.setTime(sf.parse(date1)); // 设置为当前系统时间
		dateTwo.setTime(sf.parse(date2)); // 设置为2015年1月15日
		long timeOne = dateOne.getTimeInMillis();
		long timeTwo = dateTwo.getTimeInMillis();
		long minute = (timeTwo - timeOne) / (1000 * 60);// 转化minute

		return (int) minute;
	}

}
